package com.wish.renting.config;

import org.apache.pdfbox.io.IOUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class FileUtil {
    /**
     * 下载预览文件
     *
     * @param response
     * @param source       源文件
     * @param downloadName 下载的文件名
     * @param mode         模式 0 下载 1 预览
     * @throws IOException
     */
/*
  JSONObject jsonObject = JSONUtil.parseObj(s);
        JSONObject data = jsonObject.getJSONObject("data");
        JSONArray result = data.getJSONArray("result");
        List<Result> results = result.toList(Result.class);
 */


    //        FileUtil.download(response,"D:\\pdf导出\\物料信息表.png","1.png",1);
    public static void download(HttpServletResponse response, String source, String downloadName, int mode) throws IOException {
        String modeStr = "inline";
        if (mode == 0) {
            modeStr = "attachment";
            downloadName = new String(downloadName.getBytes("utf-8"), "iso-8859-1");
        }
        response.setHeader("Content-Disposition", modeStr + ";fileName=" + downloadName);
        InputStream iStream = new FileInputStream(source);
        IOUtils.copy(iStream, response.getOutputStream());
        iStream.close();
    }

    /**
     * 文件验证
     *
     * @param file
     * @return
     */
    public static String getMD5(MultipartFile file) {
        StringBuffer sb = new StringBuffer("");
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(file.getBytes());
            byte b[] = md.digest();
            int d;
            for (int i = 0; i < b.length; i++) {
                d = b[i];
                if (d < 0) {
                    d = b[i] & 0xff;
                    // 与上一行效果等同
                    // i += 256;
                }
                if (d < 16) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(d));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    /**
     * 8、大文件，断点续传
     *
     * @param part
     * @param index
     * @param token
     * @return
     */
    public static Map<String, Object> upload(MultipartFile part, int index, String token, String path) {
        System.out.println("index is " + index);
        System.out.println("part is " + part);
        System.out.println("token is " + token);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("token", token); // 生成文件名称
        map.put("index", index); // 上传片段
        // 生成唯一的文件
        if (!StringUtils.hasText(token)) {
            token = UUID.randomUUID().toString();
        }
        // 直接用token 当成上传以后的文件名。
        // 判断文件是否存在
        File file = new File(path + token + ".jpg");
        // 文件不存在 而且是首个片段
        if (!file.exists() && index == 0) {
            try {
                part.transferTo(file);// 第0个片段 直接另存 就好了
            } catch (IllegalStateException | IOException e) {
                // TODO Auto-generated
                // catch block
                e.printStackTrace();
                map.put("result", "error"); // 上传成功失败标记
                return map;
            } // 第一个片段上传成功
            System.out.println("第一个片段处理成功");
            map.put("result", "ok"); // 上传成功失败标记
            return map;
        } else if (file.exists() && index > 0) {
            // 上传的是非第一个片段 进行追加
            try {
                // 打开原来已经上传成功文件输出流
                FileOutputStream outputStream = new FileOutputStream(file, true);
                // 获取正在上传文件片段的输入流
                InputStream inputStream = part.getInputStream();

                // 利用流拷贝 进行文件的追加
                byte b[] = new byte[1024]; // 追加
                int len = 0;
                while ((len = inputStream.read(b)) > 0) {
                    outputStream.write(b, 0, len);
                }
                outputStream.close();
            } catch (IOException e) { // TODO Auto-generated catch block
                e.printStackTrace();
                map.put("result", "error"); // 上传成功失败标记
                return map;
            } // 片段追加成功
            System.out.println("中间片段处理成功");
            map.put("result", "ok"); // 上传成功失败标记
            return map;
        } else { // 片段与编号不相符合 return new
            System.out.println("片段与编号不相符合 ");
            map.put("result", "error"); // 上传成功失败标记
            return map;
        }

    }

}
